{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = [[0, 0], [1, 1]]\n",
    "Y = [0, 1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "dt_test_clf = tree.DecisionTreeClassifier()\n",
    "dt_test_clf = dt_test_clf.fit(X, Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt_test_clf.predict([[2., 2.]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 1.]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt_test_clf.predict_proba([[2., 2.]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import load_iris\n",
    "from sklearn import tree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "iris = load_iris()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "dt_clf = tree.DecisionTreeClassifier()\n",
    "dt_clf = dt_clf.fit(iris.data, iris.target)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred = dt_clf.predict(iris.data)\n",
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Matplotlib is building the font cache; this may take a moment.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[Text(167.4, 199.32, 'X[3] <= 0.8\\ngini = 0.667\\nsamples = 150\\nvalue = [50, 50, 50]'),\n",
       " Text(141.64615384615385, 163.07999999999998, 'gini = 0.0\\nsamples = 50\\nvalue = [50, 0, 0]'),\n",
       " Text(193.15384615384616, 163.07999999999998, 'X[3] <= 1.75\\ngini = 0.5\\nsamples = 100\\nvalue = [0, 50, 50]'),\n",
       " Text(103.01538461538462, 126.83999999999999, 'X[2] <= 4.95\\ngini = 0.168\\nsamples = 54\\nvalue = [0, 49, 5]'),\n",
       " Text(51.50769230769231, 90.6, 'X[3] <= 1.65\\ngini = 0.041\\nsamples = 48\\nvalue = [0, 47, 1]'),\n",
       " Text(25.753846153846155, 54.359999999999985, 'gini = 0.0\\nsamples = 47\\nvalue = [0, 47, 0]'),\n",
       " Text(77.26153846153846, 54.359999999999985, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 1]'),\n",
       " Text(154.52307692307693, 90.6, 'X[3] <= 1.55\\ngini = 0.444\\nsamples = 6\\nvalue = [0, 2, 4]'),\n",
       " Text(128.76923076923077, 54.359999999999985, 'gini = 0.0\\nsamples = 3\\nvalue = [0, 0, 3]'),\n",
       " Text(180.27692307692308, 54.359999999999985, 'X[2] <= 5.45\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 2, 1]'),\n",
       " Text(154.52307692307693, 18.119999999999976, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 2, 0]'),\n",
       " Text(206.03076923076924, 18.119999999999976, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 0, 1]'),\n",
       " Text(283.2923076923077, 126.83999999999999, 'X[2] <= 4.85\\ngini = 0.043\\nsamples = 46\\nvalue = [0, 1, 45]'),\n",
       " Text(257.53846153846155, 90.6, 'X[1] <= 3.1\\ngini = 0.444\\nsamples = 3\\nvalue = [0, 1, 2]'),\n",
       " Text(231.7846153846154, 54.359999999999985, 'gini = 0.0\\nsamples = 2\\nvalue = [0, 0, 2]'),\n",
       " Text(283.2923076923077, 54.359999999999985, 'gini = 0.0\\nsamples = 1\\nvalue = [0, 1, 0]'),\n",
       " Text(309.04615384615386, 90.6, 'gini = 0.0\\nsamples = 43\\nvalue = [0, 0, 43]')]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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yxeQvAkEAdHxLIQQwUKeBiyE8DuB0k1SW2O7TAKqpZuVlUVhYSErVqxgy5YtvPvuu3zyySesW7eO1157jVOnTtX5KObq6up693ngwAFmznS/cWbDhg289NJLVFdXM23aNF599VVPhxJ0jMqb2vkhedN4deXPZ599xpQpUwCalT/79+8nLS2Nd955x7VsyZIl5OTktDi9Vqs1SvvBNIxNeTX2RyKgKt1Zs2bxxBNP8PDDDwMQFxfHkCFDKCsr4/r16wwYMICwsDDX+kVFRbz00kukp6cDuB4Tsn79etc6o0eP5u6773Z9vnLlCh999JFrdvrw8HDXY0hE/YzIG3DPD8mbxqsrf3784x8zduxYgGblz4gRI/j6669p166da9n8+fO9H0yAC6hKt6KigrCwMC5fdr/D9rnnnqOiouKW9VNSUujRowfJycmNPkZVVRU//OEPGTx4MMeOHXPNgF9ZGZRDcD3GiLwB3PJD8qbx6suf+jQmf0wmE7/73e/4+9//7qFUtlxenvvkeKWlpRw9erTBbW5+GObnn3/O8uXLycrK8koaA6pPNzMzk40bN7JmzRpiYmIAePfddzl48KDrc23Z2dmcOnWKjIwM1yNCbvbpp5+yf/9+hg0bxuXLl0lKSsJms/HOO++QmprKqlWrKCkpoX37gJzQyDBG5M24cePYtGkTJSUlfPfdd7z00kuSN41UV/6cO3eO/fv3069fP6ZOneq2fmPyJzs7m08++YT4+HhycnJISkrijTfe4LPPPuPBBx+kQ4cOBkTmiM1ut1NUVESXLl1o164d+/bto7Kykrlz53LmzBmGDx9OUVGRq+sjNjbWFbPWNx6GOX36dHbv3k1qaqqrle9xvu4HuflFIx8H8t577+n33nvPbdnnn3+uX3311UZt70n42eNAvP26XR75S960tnzRjfz++EP+3C5vGlsPaK31b3/7W6211s8++6xOS0vTH3zwgT548KBOS0vTZ86c0W+88YbWWutz587pdevW6XXr1uk//vGPru3NZrMuLCzUOTk5Wmut161bp6uqqrTZbPZoTM5XQHUv1DZ+/HiqqqrclkVGRjJgwIAGt7vdqcTrr7+O2WymuLiYqVOncunSJe8EEMQ8lTdwIz8aei+apqqqivHjx7s+l5aW8u233/Loo4/Wu40/5023bt14+eWX3S76tWlza9UWExPj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xMXFERERwejRo9mwYQOPPvooYWE3pswoKirizTffpKqqipSUFNLT0wEICQlhwYIFAERERHD+/HnatHH0ttntdgoKClyTe4eHh7ueQitES3m9TzcvL8/tc2lpKUePNnwh9eYH4H3++ecsX76crKwsr6WzsYIpnkCMpaKigrCwMC5fdr8gbjabmTNnzi3rp6Sk0KNHD5KTk+vd569+9SueeeYZXnvtNQCOHz9OcXEx+/fv5+LFi64nLVRWGje+PxDzpiHBFk9LeKWlm5mZid1up6ioiC5dutCuXTv27dtHZWUlc+fO5cyZMwwfPpyioiJychxjpmNjY5k6dSrg/vz56dOns3v3blJTU12tFKMFUzyBHktmZiYbN25kzZo1xMQ47s7+/e9/zzfffMOhQ4e4//773dbPzs7m1KlTZGRkuB5Fc7M//elPHD58mISEBHJyckhKSmLEiBGYzWbatGnDqlWrKCkpoX379l6PLZDzJtjj8RSvtHQtFgvz5s1zna4BTJo0ifDwcG8czuuCKZ5Aj+XJJ5+kQ4cOpKam0rt3bwoKCpg3bx7r16/n/vvv59SpU9x5551u2wwYMKDBlu7UqVN5/vnnmTRpEklJN+Y3Wrx4MeHh4SxdutSQL3qg583Ngi0eT/FKS7dbt268/PLLVFdXu5bV/sM7xcTE1Pll0NrxALxFixaRk5NDYmIiK1eupGfPnt5I7m0FUzzBFMv48eNvOW2NjIxkwIABDW63du1aSktLWbRokasCeP311zl79iyLFy+u9723BVPeQPDF4yleGb1w4sQJ8vLy6N+/P1OmTGlJ+lrME6MX/CEeT11VDoZYbj5tjYuLczttPXLkCElJSfWetq5Zs4akpCSOHDnC9OnTOX36NKdPn+b48eM89NBDdb5vqNKVvKlboMRjNK+0dAcPHszgwYO9sWufCKZ4giEWi8XCM888Q2rqjcdxTZo0iX379jVrfwcOHODSpUscOnSI6OjoOt8bIRjyprZgi8dTfHZHmtncvCe5HDt2jHnz5vHdd9+Rnp7O5MmTuXr1qodT1zzNjWnJkiWuFpm/aE4sVquV9evX85vf/MYLKbqhqaetycnJrlYu3Dhtvffee8nJyWHmzJkkJydzzz331PvenzQnby5evMjq1atJSUnxQopaJpi+N43hkZZuZmYm165dIykpiezsbGw2GxERERQV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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "tree.plot_tree(dt_clf.fit(iris.data, iris.target))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import datasets\n",
    "from sklearn.naive_bayes import GaussianNB"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "iris = datasets.load_iris()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "gnb = GaussianNB()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GaussianNB()"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 训练模型\n",
    "gnb.fit(iris.data, iris.target)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 进⾏预测\n",
    "y_pred = gnb.predict(iris.data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import neighbors, datasets"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "iris = datasets.load_iris()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 指定近邻个数\n",
    "n_neighbors = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=10, weights='distance')"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# weights 可选：'uniform', 'distance'\n",
    "weights = 'distance'\n",
    "knn_clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)\n",
    "knn_clf.fit(iris.data, iris.target)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_pre_y = knn_clf.predict(iris.data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
       "       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n",
       "       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_pre_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy import interp\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import svm, datasets\n",
    "from sklearn import metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 准备数据\n",
    "iris = datasets.load_iris()\n",
    "X = iris.data\n",
    "y = iris.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "100"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 取出第⼀类和第⼆类\n",
    "X, y = X[y != 2], y[y != 2]\n",
    "n_samples, n_features = X.shape\n",
    "n_samples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 加⼊噪声特征\n",
    "random_state = np.random.RandomState(0)\n",
    "X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 随机选取80个样本作为训练集，其余作为测试集\n",
    "t = np.array(range(100))\n",
    "np.random.shuffle(t)\n",
    "train_idx = t >= 30\n",
    "\n",
    "\n",
    "train_X = X[train_idx,:]\n",
    "train_y = y[train_idx]\n",
    "text_X = X[~train_idx,:]\n",
    "test_y= y[~train_idx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "svc_clf = svm.SVC(kernel='linear', probability=True,\n",
    " random_state=random_state)\n",
    "svc_clf = svc_clf.fit(train_X, train_y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "#准确率\n",
    "y_pre = svc_clf.predict(text_X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.accuracy_score(test_y,y_pre)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[11  2]\n",
      " [ 7 10]]\n"
     ]
    }
   ],
   "source": [
    "#混淆矩阵\n",
    "cnf_matrix = metrics.confusion_matrix(test_y, y_pre)\n",
    "print(cnf_matrix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "#ROC图\n",
    "from sklearn.metrics import roc_curve, auc"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "tprs = []\n",
    "aucs = []\n",
    "mean_fpr = np.linspace(0, 1, 100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-37-c17acd80822c>:3: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead\n",
      "  tprs.append(interp(mean_fpr, fpr, tpr))\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2a8d73be640>]"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "probas_ = svc_clf.predict_proba(text_X)\n",
    "fpr, tpr, thresholds = roc_curve(test_y, probas_[:, 1])\n",
    "tprs.append(interp(mean_fpr, fpr, tpr))\n",
    "tprs[-1][0] = 0.0\n",
    "roc_auc = auc(fpr, tpr)\n",
    "aucs.append(roc_auc)\n",
    "plt.plot(fpr, tpr, lw=1, alpha=0.3,\n",
    " label='ROC Curve (AUC = %0.2f)' % roc_auc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from scipy import interp\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import svm, datasets\n",
    "from sklearn.metrics import roc_curve, auc\n",
    "from sklearn.model_selection import StratifiedKFold"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 载⼊数据 只取第⼀类和第⼆类\n",
    "iris = datasets.load_iris()\n",
    "X = iris.data\n",
    "y = iris.target\n",
    "X, y = X[y != 2], y[y != 2]\n",
    "n_samples, n_features = X.shape\n",
    "# Add noisy features\n",
    "random_state = np.random.RandomState(0)\n",
    "X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 采⽤交叉验证的⽅式训练模型\n",
    "cv = StratifiedKFold(n_splits=5)\n",
    "classifier = svm.SVC(kernel='linear', probability=True,\n",
    " random_state=random_state)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "tprs = []\n",
    "aucs = []\n",
    "mean_fpr = np.linspace(0, 1, 100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "<ipython-input-46-bdbbbf12ed2f>:7: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead\n",
      "  tprs.append(interp(mean_fpr, fpr, tpr))\n",
      "<ipython-input-46-bdbbbf12ed2f>:7: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead\n",
      "  tprs.append(interp(mean_fpr, fpr, tpr))\n",
      "<ipython-input-46-bdbbbf12ed2f>:7: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead\n",
      "  tprs.append(interp(mean_fpr, fpr, tpr))\n",
      "<ipython-input-46-bdbbbf12ed2f>:7: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead\n",
      "  tprs.append(interp(mean_fpr, fpr, tpr))\n",
      "<ipython-input-46-bdbbbf12ed2f>:7: DeprecationWarning: scipy.interp is deprecated and will be removed in SciPy 2.0.0, use numpy.interp instead\n",
      "  tprs.append(interp(mean_fpr, fpr, tpr))\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 统计每次结果，并绘制相应的ROC曲线\n",
    "i = 0\n",
    "for train, test in cv.split(X, y):\n",
    "     probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test])\n",
    "     # Compute ROC curve and area the curve\n",
    "     fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])\n",
    "     tprs.append(interp(mean_fpr, fpr, tpr))\n",
    "     tprs[-1][0] = 0.0\n",
    "     roc_auc = auc(fpr, tpr)\n",
    "     aucs.append(roc_auc)\n",
    "     plt.plot(fpr, tpr, lw=1, alpha=0.3,\n",
    "         label='ROC fold %d (AUC = %0.2f)' % (i, roc_auc))\n",
    "     i += 1\n",
    "plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',\n",
    "     label='Chance', alpha=.8)\n",
    "\n",
    "# 计算平均结果，绘制平均ROC曲线\n",
    "mean_tpr = np.mean(tprs, axis=0)\n",
    "mean_tpr[-1] = 1.0\n",
    "mean_auc = auc(mean_fpr, mean_tpr)\n",
    "std_auc = np.std(aucs)\n",
    "plt.plot(mean_fpr, mean_tpr, color='b',\n",
    "         label=r'Mean ROC (AUC = %0.2f $\\pm$ %0.2f)' % (mean_auc, std_auc),\n",
    "         lw=2, alpha=.8)\n",
    "\n",
    "# 将均值线上下⼀个标准差内的区域上⾊\n",
    "std_tpr = np.std(tprs, axis=0)\n",
    "tprs_upper = np.minimum(mean_tpr + std_tpr, 1)\n",
    "tprs_lower = np.maximum(mean_tpr - std_tpr, 0)\n",
    "plt.fill_between(mean_fpr, tprs_lower, tprs_upper, color='grey', alpha=.2,\n",
    "                 label=r'$\\pm$ 1 std. dev.')\n",
    "\n",
    "plt.xlim([-0.05, 1.05])\n",
    "plt.ylim([-0.05, 1.05])\n",
    "plt.xlabel('False Positive Rate')\n",
    "plt.ylabel('True Positive Rate')\n",
    "plt.title('Receiver operating characteristic')\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
